Quería crear un Web Worker así:
const blob = URL.createObjectURL(new Blob([` ... `], {type: 'text/javascript'})) const worker = new Worker(blob)Pero al hacerlo en Deno obtengo:
error: Uncaught NotSupported: Classic workers are not supported. const worker = new Worker(blob) ^Busqué en Google este mensaje "Los trabajadores clásicos no son compatibles" y básicamente no encontré nada que explique la historia detrás de él o qué significa específicamente. Encontré un poco sobre una forma especial de Deno de crear trabajadores:
const worker = new Worker(new URL("worker.js", import.meta.url).href, { type: "module", deno: true, }); worker.postMessage({ filename: "./log.txt" });pero no parece satisfacer mis necesidades porque específicamente necesito inicializar un trabajador dinámicamente desde una cadena (o al menos desde una función arbitraria pasada en tiempo de ejecución).
¿Hay alguna forma de hacer lo que necesito hacer en Deno?
Editar: logré encontrar esta página en los documentos (los documentos de Deno tienen problemas para mostrar resultados en los motores de búsqueda, por alguna razón), aunque no es un buen augurio porque parece que no hay manera de hacer lo que necesito para hacer https://deno.land/manual/runtime/web_platform_apis#web-worker-api
Actualmente, Deno no admite trabajadores "clásicos".
Desde Worker() - API web | MDN :
type: unDOMStringque especifica el tipo de trabajador que se va a crear. El valor puede serclassicomodule. Si no se especifica, el valor predeterminado utilizado esclassic.
de los trabajadores | manuales | Deno :
Actualmente, Deno solo admite trabajadores de tipo
module; por lo tanto, es esencial pasar eltype: "module"al crear un nuevo trabajador.
Para su caso de uso, es posible que pueda usar una URL de datos . p.ej:
new Worker( `data:text/javascript;base64,${btoa( `console.log("hello world"); self.close();` )}`, { type: "module" } );La información provista en la respuesta de mfulton26 es correcta, pero no necesita una URL de datos: simplemente necesita agregar { type: "module" } a las opciones de instanciación de su trabajador. Deno incluso admite TypeScript como fuente para su trabajador:
blob-worker.ts :
const workerModuleSource = ` const version: string = Deno.version.deno; console.log(\`Hello from Deno v\${version}\`); self.close(); `; const blob = new Blob( [workerModuleSource], {type: 'application/typescript'}, ); const objUrl = URL.createObjectURL(blob); const worker = new Worker(objUrl, { deno: true, type: 'module', }); URL.revokeObjectURL(objUrl); $ deno run --unstable blob-worker.ts Hello from Deno v1.14.1